import re
from typing import List, Dict, Optional

def extract_company_name_optimized_v2(text_positions: List[Dict], logger) -> Optional[str]:
    """新版营业执照公司名称提取 - 优化版V2"""
    # 策略1: 寻找不包含"经营范围"等干扰词的完整公司名称
    for text_pos in text_positions:
        text = text_pos['text'].strip()
        # 如果文本包含公司关键词且不包含干扰词
        if (any(keyword in text for keyword in ['公司', '企业', '集团']) and
            not any(disturb in text for disturb in ['经营范围', '范围', '称', '型', '所', '注册', '成立']) and
            len(text) > 6):  # 公司名称通常比较长
            logger.info(f"V2找到完整公司名称: {text}")
            return text

    # 策略2: 从经营范围文本中提取公司名称（如果策略1失败）
    for text_pos in text_positions:
        text = text_pos['text']
        if '经营范围' in text or ('称' in text and '公司' in text):
            # 使用正则提取公司名称模式
            company_pattern = r'称?([^。]{0,20}(?:公司|企业|集团|有限责任公司|股份有限公司))'
            matches = re.findall(company_pattern, text)
            if matches:
                company_name = matches[0].strip()
                if len(company_name) > 3:
                    logger.info(f"V2从经营范围文本提取公司名称: {company_name}")
                    return company_name

    return None

def extract_unified_social_credit_code_optimized_v2(text_positions: List[Dict], logger) -> Optional[str]:
    """新版营业执照统一社会信用代码提取 - 优化版V2"""
    # 策略1: 直接寻找18位代码模式
    for text_pos in text_positions:
        text = text_pos['text']
        # 匹配18位统一社会信用代码
        credit_code_pattern = r'([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10})'
        matches = re.findall(credit_code_pattern, text)
        if matches:
            logger.info(f"V2直接匹配统一社会信用代码: {matches[0]}")
            return matches[0]

    # 策略2: 从包含"统一社会信用代码"关键词的文本中提取
    for text_pos in text_positions:
        text = text_pos['text']
        if '统一社会信用代码' in text:
            # 移除关键词，提取剩余的代码部分
            remaining = text.replace('统一社会信用代码', '').strip()
            # 验证是否为有效的18位代码
            if len(remaining) == 18 and re.match(r'^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$', remaining):
                logger.info(f"V2从关键词文本提取统一社会信用代码: {remaining}")
                return remaining

            # 尝试从文本中找到18位代码
            code_pattern = r'([0-9A-HJ-NPQRTUWXY]{18})'
            matches = re.findall(code_pattern, remaining)
            if matches:
                logger.info(f"V2从关键词文本匹配统一社会信用代码: {matches[0]}")
                return matches[0]

    return None

def extract_legal_representative_optimized_v2(text_positions: List[Dict], logger) -> Optional[str]:
    """新版营业执照法定代表人提取 - 优化版V2"""
    legal_rep_candidates = []

    # 策略1: 寻找"法定代表人"关键词附近的人名
    for i, text_pos in enumerate(text_positions):
        text = text_pos['text']
        if '法定代表人' in text:
            # 检查后续几个文本块
            for j in range(i + 1, min(i + 5, len(text_positions))):
                next_text = text_positions[j]['text'].strip()
                # 严格的人名验证：2-4个中文字符，不包含数字、地名、单位词等
                if (re.match(r'^[\u4e00-\u9fff]{2,4}$', next_text) and
                    not any(keyword in next_text for keyword in [
                        '万', '元', '资', '本', '年', '月', '日', '市', '区', '县', '路', '街', '号',
                        '公司', '企业', '有限', '责任', '股份', '集团', '营业', '执照', '代码',
                        '注册', '成立', '期限', '范围', '类型', '住所', '登记', '机关', '核准'
                    ])):
                    legal_rep_candidates.append({
                        'name': next_text,
                        'confidence': 90,  # 高置信度
                        'method': 'keyword_adjacent'
                    })

    # 策略2: 直接寻找可能的人名（严格过滤）
    for text_pos in text_positions:
        text = text_pos['text'].strip()
        if (re.match(r'^[\u4e00-\u9fff]{2,4}$', text) and
            not any(keyword in text for keyword in [
                '万', '元', '资', '本', '年', '月', '日', '市', '区', '县', '路', '街', '号', '室', '层',
                '公司', '企业', '有限', '责任', '股份', '集团', '营业', '执照', '代码', '称', '型', '所',
                '注册', '成立', '期限', '范围', '登记', '机关', '核准', '统一', '社会', '信用',
                '东', '西', '南', '北', '中', '内', '外', '上', '下', '前', '后', '左', '右'
            ]) and
            # 排除常见地名后缀
            not text.endswith('区') and not text.endswith('市') and not text.endswith('县')):
            legal_rep_candidates.append({
                'name': text,
                'confidence': 60,  # 中等置信度
                'method': 'pattern_match'
            })

    # 选择置信度最高的候选
    if legal_rep_candidates:
        best_candidate = max(legal_rep_candidates, key=lambda x: x['confidence'])
        logger.info(f"V2找到法定代表人: {best_candidate['name']} (方法: {best_candidate['method']})")
        return best_candidate['name']

    return None